{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial 8: CV preset"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"../../imgs/lightautoml_logo_color.png\" alt=\"LightAutoML logo\" style=\"width:100%;\"/>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Official LightAutoML github repository is [here](https://github.com/sb-ai-lab/LightAutoML)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "In this tutorial we will look how to apply LightAutoML to computer vision tasks. \n",
    "\n",
    "Basically, the corresponding modules are designed to solve problems where the image is more of an auxiliary value (complement the rest of the data from the table) than for solving full-fledged CV problems. In LightAutoML working with images goes essentially through tabular data, that is, not the images themselves are used, but the paths for them. They should be written in a separate column, which needs to specify the corresponding ```'path'``` role. The target variable and optionally other features are also specified in the table. To make predictions, numerical features are extracted from images, such as color histograms (RGB or HSV) and image embeddings based on EfficientNet (with the option to select a version and use [AdvProp weights](https://arxiv.org/abs/1911.09665)), and then standard machine learning models available in LightAutoML (as in conventional tabular presets) can be applied to them. By default, linear regression with L2 regularization and CatBoost are used. Linear regression is trained on image embeddings, CatBoost is trained on histogram features, and weighted blending is finally applied to their predictions."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As an example, let's consider the [Paddy Doctor competition](https://www.kaggle.com/competitions/paddy-disease-classification/data?select=train.csv) - the task of multi-class classification, determining the type of paddy leaf disease based on photographs and other numerical features. Data is a set of images and a table, each row of which corresponds to a specific image with a specification of the path to it."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importing libraries and preparing data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "We will use the data from Kaggle. You can download the dataset [from this link](https://www.kaggle.com/competitions/paddy-disease-classification/data?select=train.csv) and import it in any convenient way. For example, we download the data using [kaggle API](https://www.kaggle.com/general/74235) and install some corresponding requirements. You can run next cell for loading data and installing packages in this way:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "##Kaggle functionality for loading data; Note that you have to use your kaggle API token (see the link above):\n",
    "# !pip install opendatasets\n",
    "# !pip install -q kaggle\n",
    "# !pip install --upgrade --force-reinstall --no-deps kaggle\n",
    "# !mkdir ~/.kaggle\n",
    "# !ls ~/.kaggle\n",
    "# import os.path\n",
    "# assert os.path.isfile(\"kaggle.json\")\n",
    "# !cp kaggle.json ~/.kaggle/\n",
    "# !chmod 600 ~/.kaggle/kaggle.json\n",
    "# !kaggle competitions download -c paddy-disease-classification\n",
    "\n",
    "# #Unpack data:\n",
    "# !mkdir paddy-disease\n",
    "# !unzip paddy-disease-classification.zip -d paddy-disease\n",
    "\n",
    "# #Install LightAutoML, Pandas and torch EfficientNet:\n",
    "# !pip install -U lightautoml[cv] #[cv] is for installing CV tasks functionality\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.066681,
     "end_time": "2021-06-22T20:10:53.090975",
     "exception": false,
     "start_time": "2021-06-22T20:10:53.024294",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "\n",
    "\n",
    "Then we will import the libraries we use in this kernel:\n",
    "- Standard python libraries for timing, working with OS etc.\n",
    "- Essential python DS libraries like numpy, pandas, scikit-learn and torch (the last we will use in the next cell)\n",
    "- LightAutoML modules: `TabularCVAutoML` preset for AutoML model creation and Task class to setup what kind of ML problem we solve (binary/multiclass classification or regression)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"CUDA_DEVICE_ORDER\"]=\"PCI_BUS_ID\"   # see issue #152\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"0\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:51:46.798354Z",
     "iopub.status.busy": "2022-07-05T14:51:46.797984Z",
     "iopub.status.idle": "2022-07-05T14:51:49.606148Z",
     "shell.execute_reply": "2022-07-05T14:51:49.605139Z",
     "shell.execute_reply.started": "2022-07-05T14:51:46.798321Z"
    },
    "papermill": {
     "duration": 8.32949,
     "end_time": "2021-06-22T20:11:01.487788",
     "exception": false,
     "start_time": "2021-06-22T20:10:53.158298",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "'nlp' extra dependecy package 'gensim' isn't installed. Look at README.md in repo 'LightAutoML' for installation instructions.\n",
      "'nlp' extra dependecy package 'nltk' isn't installed. Look at README.md in repo 'LightAutoML' for installation instructions.\n",
      "'nlp' extra dependecy package 'transformers' isn't installed. Look at README.md in repo 'LightAutoML' for installation instructions.\n",
      "'nlp' extra dependecy package 'gensim' isn't installed. Look at README.md in repo 'LightAutoML' for installation instructions.\n",
      "'nlp' extra dependecy package 'nltk' isn't installed. Look at README.md in repo 'LightAutoML' for installation instructions.\n",
      "'nlp' extra dependecy package 'transformers' isn't installed. Look at README.md in repo 'LightAutoML' for installation instructions.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/dvladimirvasilyev/LightAutoML/lightautoml/ml_algo/dl_model.py:41: UserWarning: 'transformers' - package isn't installed\n",
      "  warnings.warn(\"'transformers' - package isn't installed\")\n",
      "/home/dvladimirvasilyev/LightAutoML/lightautoml/text/nn_model.py:22: UserWarning: 'transformers' - package isn't installed\n",
      "  warnings.warn(\"'transformers' - package isn't installed\")\n",
      "/home/dvladimirvasilyev/LightAutoML/lightautoml/text/dl_transformers.py:25: UserWarning: 'transformers' - package isn't installed\n",
      "  warnings.warn(\"'transformers' - package isn't installed\")\n"
     ]
    }
   ],
   "source": [
    "# Standard python libraries\n",
    "import os\n",
    "import time\n",
    "\n",
    "# Essential DS libraries\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.metrics import f1_score, accuracy_score, confusion_matrix\n",
    "from sklearn.model_selection import train_test_split\n",
    "import torch\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# LightAutoML presets, task and report generation\n",
    "from lightautoml.automl.presets.image_presets import TabularCVAutoML\n",
    "from lightautoml.tasks import Task"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.086481,
     "end_time": "2021-06-22T20:11:01.927314",
     "exception": false,
     "start_time": "2021-06-22T20:11:01.840833",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "\n",
    "For better reproducibility fix numpy random seed with max number of threads for Torch (which usually try to use all the threads on server):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:51:52.670042Z",
     "iopub.status.busy": "2022-07-05T14:51:52.669639Z",
     "iopub.status.idle": "2022-07-05T14:51:52.694336Z",
     "shell.execute_reply": "2022-07-05T14:51:52.693519Z",
     "shell.execute_reply.started": "2022-07-05T14:51:52.670013Z"
    },
    "papermill": {
     "duration": 0.087268,
     "end_time": "2021-06-22T20:11:02.092497",
     "exception": false,
     "start_time": "2021-06-22T20:11:02.005229",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "torch.set_num_threads(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.072033,
     "end_time": "2021-06-22T20:11:02.238196",
     "exception": false,
     "start_time": "2021-06-22T20:11:02.166163",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "\n",
    "Let's check the data we have:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:52:17.214594Z",
     "iopub.status.busy": "2022-07-05T14:52:17.213593Z",
     "iopub.status.idle": "2022-07-05T14:52:17.219652Z",
     "shell.execute_reply": "2022-07-05T14:52:17.218659Z",
     "shell.execute_reply.started": "2022-07-05T14:52:17.214546Z"
    }
   },
   "outputs": [],
   "source": [
    "INPUT_DIR = './paddy-disease/'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:52:24.806286Z",
     "iopub.status.busy": "2022-07-05T14:52:24.805673Z",
     "iopub.status.idle": "2022-07-05T14:52:24.852628Z",
     "shell.execute_reply": "2022-07-05T14:52:24.851665Z",
     "shell.execute_reply.started": "2022-07-05T14:52:24.806252Z"
    },
    "papermill": {
     "duration": 12.710747,
     "end_time": "2021-06-22T20:11:15.01836",
     "exception": false,
     "start_time": "2021-06-22T20:11:02.307613",
     "status": "completed"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10407, 4)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>variety</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100330.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100365.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100382.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100632.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>101918.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     image_id                  label variety  age\n",
       "0  100330.jpg  bacterial_leaf_blight   ADT45   45\n",
       "1  100365.jpg  bacterial_leaf_blight   ADT45   45\n",
       "2  100382.jpg  bacterial_leaf_blight   ADT45   45\n",
       "3  100632.jpg  bacterial_leaf_blight   ADT45   45\n",
       "4  101918.jpg  bacterial_leaf_blight   ADT45   45"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data = pd.read_csv(INPUT_DIR + 'train.csv')\n",
    "print(train_data.shape)\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:55:47.853158Z",
     "iopub.status.busy": "2022-07-05T14:55:47.852592Z",
     "iopub.status.idle": "2022-07-05T14:55:47.871645Z",
     "shell.execute_reply": "2022-07-05T14:55:47.870788Z",
     "shell.execute_reply.started": "2022-07-05T14:55:47.853116Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "normal                      1764\n",
       "blast                       1738\n",
       "hispa                       1594\n",
       "dead_heart                  1442\n",
       "tungro                      1088\n",
       "brown_spot                   965\n",
       "downy_mildew                 620\n",
       "bacterial_leaf_blight        479\n",
       "bacterial_leaf_streak        380\n",
       "bacterial_panicle_blight     337\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data['label'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:53:50.520585Z",
     "iopub.status.busy": "2022-07-05T14:53:50.520132Z",
     "iopub.status.idle": "2022-07-05T14:53:50.538089Z",
     "shell.execute_reply": "2022-07-05T14:53:50.536992Z",
     "shell.execute_reply.started": "2022-07-05T14:53:50.520543Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ADT45             6992\n",
       "KarnatakaPonni     988\n",
       "Ponni              657\n",
       "AtchayaPonni       461\n",
       "Zonal              399\n",
       "AndraPonni         377\n",
       "Onthanel           351\n",
       "IR20               114\n",
       "RR                  36\n",
       "Surya               32\n",
       "Name: variety, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data['variety'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:54:18.244667Z",
     "iopub.status.busy": "2022-07-05T14:54:18.244319Z",
     "iopub.status.idle": "2022-07-05T14:54:18.252756Z",
     "shell.execute_reply": "2022-07-05T14:54:18.251740Z",
     "shell.execute_reply.started": "2022-07-05T14:54:18.244636Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "70    3077\n",
       "60    1660\n",
       "50    1066\n",
       "75     866\n",
       "65     774\n",
       "55     563\n",
       "72     552\n",
       "45     505\n",
       "67     415\n",
       "68     253\n",
       "80     225\n",
       "57     213\n",
       "47     112\n",
       "77      42\n",
       "73      38\n",
       "66      36\n",
       "62       5\n",
       "82       5\n",
       "Name: age, dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data['age'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T14:55:17.360329Z",
     "iopub.status.busy": "2022-07-05T14:55:17.359745Z",
     "iopub.status.idle": "2022-07-05T14:55:17.385144Z",
     "shell.execute_reply": "2022-07-05T14:55:17.384108Z",
     "shell.execute_reply.started": "2022-07-05T14:55:17.360295Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3469, 2)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200001.jpg</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200002.jpg</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>200003.jpg</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>200004.jpg</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>200005.jpg</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     image_id  label\n",
       "0  200001.jpg    NaN\n",
       "1  200002.jpg    NaN\n",
       "2  200003.jpg    NaN\n",
       "3  200004.jpg    NaN\n",
       "4  200005.jpg    NaN"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "submission = pd.read_csv(INPUT_DIR + 'sample_submission.csv')\n",
    "print(submission.shape)\n",
    "submission.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Add a column with the full path to the images:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T15:02:33.216599Z",
     "iopub.status.busy": "2022-07-05T15:02:33.216246Z",
     "iopub.status.idle": "2022-07-05T15:02:33.235251Z",
     "shell.execute_reply": "2022-07-05T15:02:33.234204Z",
     "shell.execute_reply.started": "2022-07-05T15:02:33.216568Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 4.89 ms, sys: 485 µs, total: 5.37 ms\n",
      "Wall time: 5.14 ms\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>variety</th>\n",
       "      <th>age</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100330.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100365.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100382.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100632.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>101918.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     image_id                  label variety  age  \\\n",
       "0  100330.jpg  bacterial_leaf_blight   ADT45   45   \n",
       "1  100365.jpg  bacterial_leaf_blight   ADT45   45   \n",
       "2  100382.jpg  bacterial_leaf_blight   ADT45   45   \n",
       "3  100632.jpg  bacterial_leaf_blight   ADT45   45   \n",
       "4  101918.jpg  bacterial_leaf_blight   ADT45   45   \n",
       "\n",
       "                                                path  \n",
       "0  ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "1  ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "2  ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "3  ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "4  ./paddy-disease/train_images/bacterial_leaf_bl...  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "train_data['path'] = INPUT_DIR + 'train_images/' + train_data['label'] + '/' + train_data['image_id']\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T15:01:50.176305Z",
     "iopub.status.busy": "2022-07-05T15:01:50.175957Z",
     "iopub.status.idle": "2022-07-05T15:01:50.192594Z",
     "shell.execute_reply": "2022-07-05T15:01:50.191651Z",
     "shell.execute_reply.started": "2022-07-05T15:01:50.176276Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200001.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200001.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200002.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200002.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>200003.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200003.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>200004.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200004.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>200005.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200005.jpg</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     image_id  label                                    path\n",
       "0  200001.jpg    NaN  ./paddy-disease/test_images/200001.jpg\n",
       "1  200002.jpg    NaN  ./paddy-disease/test_images/200002.jpg\n",
       "2  200003.jpg    NaN  ./paddy-disease/test_images/200003.jpg\n",
       "3  200004.jpg    NaN  ./paddy-disease/test_images/200004.jpg\n",
       "4  200005.jpg    NaN  ./paddy-disease/test_images/200005.jpg"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "submission['path'] = INPUT_DIR + 'test_images/' + submission['image_id']\n",
    "submission.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's expand the training data with augmentations: random rotations and flips:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.mkdir('./paddy-disease/modified_train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c0e2e2174b1644ed91ed76b5f30a6d6e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "0it [00:00, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1000\n",
      "2000\n",
      "3000\n",
      "4000\n",
      "5000\n",
      "6000\n",
      "7000\n",
      "8000\n",
      "9000\n",
      "10000\n"
     ]
    }
   ],
   "source": [
    "from PIL import Image\n",
    "from tqdm.notebook import tqdm\n",
    "new_imgs = []\n",
    "\n",
    "for i, p in tqdm(enumerate(train_data['path'].values)):\n",
    "    if i % 1000 == 0: \n",
    "        print(i)\n",
    "        \n",
    "    img = Image.open(p)\n",
    "\n",
    "    for it in range(10):\n",
    "        new_img = img.rotate(np.random.rand() * 60 - 30, resample=3)\n",
    "  \n",
    "        if np.random.rand() > 0.5:\n",
    "            new_img = new_img.transpose(Image.FLIP_LEFT_RIGHT)\n",
    "        \n",
    "        new_img_name = './paddy-disease/modified_train/' + p.split('/')[-1][:-4] + '_' + str(it) + '.jpg'\n",
    "        new_img.save(new_img_name)\n",
    "        new_imgs.append([new_img_name, p.split('/')[-2], p.split('/')[-1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>variety</th>\n",
       "      <th>age</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100330.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45.0</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100365.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45.0</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100382.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45.0</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100632.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45.0</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>101918.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>ADT45</td>\n",
       "      <td>45.0</td>\n",
       "      <td>./paddy-disease/train_images/bacterial_leaf_bl...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114472</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_train/110381_5.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114473</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_train/110381_6.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114474</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_train/110381_7.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114475</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_train/110381_8.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114476</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_train/110381_9.jpg</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>114477 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          image_id                  label variety   age  \\\n",
       "0       100330.jpg  bacterial_leaf_blight   ADT45  45.0   \n",
       "1       100365.jpg  bacterial_leaf_blight   ADT45  45.0   \n",
       "2       100382.jpg  bacterial_leaf_blight   ADT45  45.0   \n",
       "3       100632.jpg  bacterial_leaf_blight   ADT45  45.0   \n",
       "4       101918.jpg  bacterial_leaf_blight   ADT45  45.0   \n",
       "...            ...                    ...     ...   ...   \n",
       "114472  110381.jpg                 tungro     NaN   NaN   \n",
       "114473  110381.jpg                 tungro     NaN   NaN   \n",
       "114474  110381.jpg                 tungro     NaN   NaN   \n",
       "114475  110381.jpg                 tungro     NaN   NaN   \n",
       "114476  110381.jpg                 tungro     NaN   NaN   \n",
       "\n",
       "                                                     path  \n",
       "0       ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "1       ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "2       ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "3       ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "4       ./paddy-disease/train_images/bacterial_leaf_bl...  \n",
       "...                                                   ...  \n",
       "114472        ./paddy-disease/modified_train/110381_5.jpg  \n",
       "114473        ./paddy-disease/modified_train/110381_6.jpg  \n",
       "114474        ./paddy-disease/modified_train/110381_7.jpg  \n",
       "114475        ./paddy-disease/modified_train/110381_8.jpg  \n",
       "114476        ./paddy-disease/modified_train/110381_9.jpg  \n",
       "\n",
       "[114477 rows x 5 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data = pd.concat([train_data, pd.DataFrame(new_imgs, columns = ['path', 'label', 'image_id'])]).reset_index(drop = True)\n",
    "train_data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's do the same for the test dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.mkdir('./paddy-disease/modified_test')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2d6a6c9a493b4a6298da4543f3ed3dba",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "0it [00:00, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1000\n",
      "2000\n",
      "3000\n"
     ]
    }
   ],
   "source": [
    "new_imgs = []\n",
    "\n",
    "for i, p in tqdm(enumerate(submission['path'].values)):\n",
    "    if i % 1000 == 0: \n",
    "        print(i)\n",
    "      \n",
    "    img = Image.open(p)\n",
    "\n",
    "    for it in range(5):\n",
    "        new_img = img.rotate(np.random.rand() * 60 - 30, resample=3)\n",
    "        if np.random.rand() > 0.5:\n",
    "            new_img = new_img.transpose(Image.FLIP_LEFT_RIGHT)\n",
    "        \n",
    "        new_img_name = './paddy-disease/modified_test/' + p.split('/')[-1][:-4] + '_' + str(it) + '.jpg'\n",
    "        new_img.save(new_img_name)\n",
    "        new_imgs.append([new_img_name, p.split('/')[-1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>path</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200001.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200001.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200002.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200002.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>200003.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200003.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>200004.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200004.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>200005.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/test_images/200005.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20809</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_test/203469_0.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20810</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_test/203469_1.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20811</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_test/203469_2.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20812</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_test/203469_3.jpg</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20813</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>NaN</td>\n",
       "      <td>./paddy-disease/modified_test/203469_4.jpg</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>20814 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         image_id  label                                        path\n",
       "0      200001.jpg    NaN      ./paddy-disease/test_images/200001.jpg\n",
       "1      200002.jpg    NaN      ./paddy-disease/test_images/200002.jpg\n",
       "2      200003.jpg    NaN      ./paddy-disease/test_images/200003.jpg\n",
       "3      200004.jpg    NaN      ./paddy-disease/test_images/200004.jpg\n",
       "4      200005.jpg    NaN      ./paddy-disease/test_images/200005.jpg\n",
       "...           ...    ...                                         ...\n",
       "20809  203469.jpg    NaN  ./paddy-disease/modified_test/203469_0.jpg\n",
       "20810  203469.jpg    NaN  ./paddy-disease/modified_test/203469_1.jpg\n",
       "20811  203469.jpg    NaN  ./paddy-disease/modified_test/203469_2.jpg\n",
       "20812  203469.jpg    NaN  ./paddy-disease/modified_test/203469_3.jpg\n",
       "20813  203469.jpg    NaN  ./paddy-disease/modified_test/203469_4.jpg\n",
       "\n",
       "[20814 rows x 3 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "submission = pd.concat([submission, pd.DataFrame(new_imgs, columns = ['path', 'image_id'])]).reset_index(drop = True)\n",
    "submission"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.071526,
     "end_time": "2021-06-22T20:11:22.853156",
     "exception": false,
     "start_time": "2021-06-22T20:11:22.78163",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Task definition"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Task type\n",
    "\n",
    "On the cell below we create ```Task``` object - the class to setup what task LightAutoML model should solve with specific loss and metric if necessary (more info can be found [here](https://lightautoml.readthedocs.io/en/latest/pages/modules/generated/lightautoml.tasks.base.Task.html#lightautoml.tasks.base.Task) in our documentation). In general, it can be any type of tasks available in LightAutoML (binary and multi-class classification, one-dimensional and multi-dimensional regression, multi-label classification), but in this case we have a multi-class classification task:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T15:03:11.435456Z",
     "iopub.status.busy": "2022-07-05T15:03:11.435099Z",
     "iopub.status.idle": "2022-07-05T15:03:11.443489Z",
     "shell.execute_reply": "2022-07-05T15:03:11.442495Z",
     "shell.execute_reply.started": "2022-07-05T15:03:11.435426Z"
    },
    "papermill": {
     "duration": 0.086442,
     "end_time": "2021-06-22T20:11:23.010643",
     "exception": false,
     "start_time": "2021-06-22T20:11:22.924201",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "task = Task('multiclass')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Default metric and loss in multi-class classification is cross-entropy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.070103,
     "end_time": "2021-06-22T20:11:23.150929",
     "exception": false,
     "start_time": "2021-06-22T20:11:23.080826",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "### Feature roles setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.069372,
     "end_time": "2021-06-22T20:11:23.290153",
     "exception": false,
     "start_time": "2021-06-22T20:11:23.220781",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Next we need to setup columns roles. It is necessary to specify the role of the target variable (```'target'```), as well as the role of the path to the images (```'path'```) in the case of using ```TabularCVAutoML```. We will also group the images (the original ones and their augmentations) and apply group k-fold cross-validation, specifying the column with ids as the ```'group'``` role:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T15:04:51.585907Z",
     "iopub.status.busy": "2022-07-05T15:04:51.585493Z",
     "iopub.status.idle": "2022-07-05T15:04:51.590716Z",
     "shell.execute_reply": "2022-07-05T15:04:51.589789Z",
     "shell.execute_reply.started": "2022-07-05T15:04:51.585872Z"
    },
    "papermill": {
     "duration": 0.07715,
     "end_time": "2021-06-22T20:11:23.43883",
     "exception": false,
     "start_time": "2021-06-22T20:11:23.36168",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "roles = {\n",
    "    'target': 'label',\n",
    "    'path': ['path'],\n",
    "    'drop': ['variety', 'age'],\n",
    "    'group': 'image_id'\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then we initialize ```TabularCVAutoML```. It is possible to specify many parameters (reader parameters, time and memory limits etc), including the EfficientNet parameters for getting embeddings: version (```B0``` by default), device, batch size (128 by default), path for weights, [AdvProp weights](https://arxiv.org/abs/1911.09665) using (for better use of the shape in images, ```True``` by default) etc. Note that the ```Utilized``` version of ```TabularCVAutoML``` for more flexible use of time resources is not yet available."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "automl = TabularCVAutoML(task = task,\n",
    "                         timeout=5 * 3600,\n",
    "                        cpu_limit = 2,\n",
    "                        reader_params = {'cv': 5, 'random_state': 42})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## AutoML training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To run autoML training use fit_predict method:\n",
    "- `train_data` - Dataset to train.\n",
    "- `roles` - Roles dict.\n",
    "- `verbose` - Controls the verbosity: the higher, the more messages.\n",
    "        <1  : messages are not displayed;\n",
    "        >=1 : the computation process for layers is displayed;\n",
    "        >=2 : the information about folds processing is also displayed;\n",
    "        >=3 : the hyperparameters optimization process is also displayed;\n",
    "        >=4 : the training process for every algorithm is displayed;\n",
    "\n",
    "Note: out-of-fold prediction is calculated during training and returned from the fit_predict method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-07-05T15:26:18.568874Z",
     "iopub.status.busy": "2022-07-05T15:26:18.568501Z",
     "iopub.status.idle": "2022-07-05T15:26:18.608695Z",
     "shell.execute_reply": "2022-07-05T15:26:18.607791Z",
     "shell.execute_reply.started": "2022-07-05T15:26:18.568842Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:04:32] Stdout logging level is INFO3.\n",
      "[14:04:32] Task: multiclass\n",
      "\n",
      "[14:04:32] Start automl preset with listed constraints:\n",
      "[14:04:32] - time: 18000.00 seconds\n",
      "[14:04:32] - CPU: 2 cores\n",
      "[14:04:32] - memory: 16 GB\n",
      "\n",
      "[14:04:32] \u001b[1mTrain data shape: (114477, 5)\u001b[0m\n",
      "\n",
      "[14:04:32] Layer \u001b[1m1\u001b[0m train process start. Time left 17999.83 secs\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 895/895 [07:29<00:00,  1.99it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:12:09] Feature path transformed\n",
      "[14:12:16] Start fitting \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m ...\n",
      "[14:12:17] ===== Start working with \u001b[1mfold 0\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:12:26] Linear model: C = 1e-05 score = -0.9995305866945853\n",
      "[14:12:32] Linear model: C = 5e-05 score = -0.6879959560713191\n",
      "[14:12:38] Linear model: C = 0.0001 score = -0.5802952177399445\n",
      "[14:12:45] Linear model: C = 0.0005 score = -0.3907926611544111\n",
      "[14:12:51] Linear model: C = 0.001 score = -0.33425017155675657\n",
      "[14:13:00] Linear model: C = 0.005 score = -0.2559518217619532\n",
      "[14:13:07] Linear model: C = 0.01 score = -0.24141776919439237\n",
      "[14:13:15] Linear model: C = 0.05 score = -0.2431661172897411\n",
      "[14:13:23] Linear model: C = 0.1 score = -0.25925367786528475\n",
      "[14:13:24] ===== Start working with \u001b[1mfold 1\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:13:32] Linear model: C = 1e-05 score = -0.9872444001968863\n",
      "[14:13:39] Linear model: C = 5e-05 score = -0.6682540100549987\n",
      "[14:13:45] Linear model: C = 0.0001 score = -0.5574685730009872\n",
      "[14:13:51] Linear model: C = 0.0005 score = -0.3653461360638747\n",
      "[14:13:58] Linear model: C = 0.001 score = -0.31059360297670363\n",
      "[14:14:05] Linear model: C = 0.005 score = -0.2370436682635623\n",
      "[14:14:14] Linear model: C = 0.01 score = -0.22495884629469698\n",
      "[14:14:21] Linear model: C = 0.05 score = -0.23420873784566962\n",
      "[14:14:29] Linear model: C = 0.1 score = -0.25263966927426823\n",
      "[14:14:29] ===== Start working with \u001b[1mfold 2\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:14:37] Linear model: C = 1e-05 score = -0.9554531133528031\n",
      "[14:14:43] Linear model: C = 5e-05 score = -0.640784196156178\n",
      "[14:14:49] Linear model: C = 0.0001 score = -0.5345024606190905\n",
      "[14:14:57] Linear model: C = 0.0005 score = -0.3546726337461952\n",
      "[14:15:04] Linear model: C = 0.001 score = -0.30344210801693483\n",
      "[14:15:12] Linear model: C = 0.005 score = -0.2331574262775805\n",
      "[14:15:19] Linear model: C = 0.01 score = -0.22071779776854528\n",
      "[14:15:28] Linear model: C = 0.05 score = -0.22603075278344578\n",
      "[14:15:36] Linear model: C = 0.1 score = -0.24138537694410292\n",
      "[14:15:36] ===== Start working with \u001b[1mfold 3\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:15:44] Linear model: C = 1e-05 score = -0.973115505822288\n",
      "[14:15:51] Linear model: C = 5e-05 score = -0.6613476137718094\n",
      "[14:15:56] Linear model: C = 0.0001 score = -0.5539538946164072\n",
      "[14:16:04] Linear model: C = 0.0005 score = -0.3666276035478478\n",
      "[14:16:10] Linear model: C = 0.001 score = -0.31130200709742806\n",
      "[14:16:18] Linear model: C = 0.005 score = -0.2326339584928626\n",
      "[14:16:25] Linear model: C = 0.01 score = -0.21658099282365262\n",
      "[14:16:33] Linear model: C = 0.05 score = -0.21364841773406087\n",
      "[14:16:42] Linear model: C = 0.1 score = -0.2256018292053085\n",
      "[14:16:51] Linear model: C = 0.5 score = -0.2763179966937595\n",
      "[14:16:51] ===== Start working with \u001b[1mfold 4\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:16:58] Linear model: C = 1e-05 score = -0.9531496536787142\n",
      "[14:17:05] Linear model: C = 5e-05 score = -0.6270339670737181\n",
      "[14:17:10] Linear model: C = 0.0001 score = -0.517302736118502\n",
      "[14:17:17] Linear model: C = 0.0005 score = -0.331531311465719\n",
      "[14:17:23] Linear model: C = 0.001 score = -0.27798570249468424\n",
      "[14:17:32] Linear model: C = 0.005 score = -0.20448637290477473\n",
      "[14:17:39] Linear model: C = 0.01 score = -0.19081673660070902\n",
      "[14:17:47] Linear model: C = 0.05 score = -0.1923892363102242\n",
      "[14:17:56] Linear model: C = 0.1 score = -0.20661581389305533\n",
      "[14:17:56] Fitting \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m finished. score = \u001b[1m-0.21831477243925082\u001b[0m\n",
      "[14:17:56] \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m fitting and predicting completed\n",
      "[14:17:56] Time left 17195.98 secs\n",
      "\n",
      "[14:22:15] Start fitting \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m ...\n",
      "[14:22:16] ===== Start working with \u001b[1mfold 0\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:22:16] 0:\tlearn: 2.2636799\ttest: 2.2649649\tbest: 2.2649649 (0)\ttotal: 6.85ms\tremaining: 27.4s\n",
      "[14:22:35] bestTest = 0.2436411292\n",
      "[14:22:35] bestIteration = 3999\n",
      "[14:22:35] ===== Start working with \u001b[1mfold 1\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:22:36] 0:\tlearn: 2.2634692\ttest: 2.2632526\tbest: 2.2632526 (0)\ttotal: 6.16ms\tremaining: 24.6s\n",
      "[14:22:55] bestTest = 0.2658199543\n",
      "[14:22:55] bestIteration = 3999\n",
      "[14:22:56] ===== Start working with \u001b[1mfold 2\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:22:56] 0:\tlearn: 2.2631654\ttest: 2.2656298\tbest: 2.2656298 (0)\ttotal: 6.08ms\tremaining: 24.3s\n",
      "[14:23:16] bestTest = 0.2753673319\n",
      "[14:23:16] bestIteration = 3999\n",
      "[14:23:16] ===== Start working with \u001b[1mfold 3\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:23:17] 0:\tlearn: 2.2645696\ttest: 2.2657045\tbest: 2.2657045 (0)\ttotal: 6.76ms\tremaining: 27s\n",
      "[14:23:37] bestTest = 0.2738943611\n",
      "[14:23:37] bestIteration = 3996\n",
      "[14:23:37] Shrink model to first 3997 iterations.\n",
      "[14:23:37] ===== Start working with \u001b[1mfold 4\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:23:38] 0:\tlearn: 2.2642805\ttest: 2.2644245\tbest: 2.2644245 (0)\ttotal: 5.84ms\tremaining: 23.4s\n",
      "[14:23:57] bestTest = 0.2538460334\n",
      "[14:23:57] bestIteration = 3999\n",
      "[14:23:58] Fitting \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m finished. score = \u001b[1m-0.2625123265864018\u001b[0m\n",
      "[14:23:58] \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m fitting and predicting completed\n",
      "[14:23:58] Time left 16834.07 secs\n",
      "\n",
      "[14:23:58] \u001b[1mLayer 1 training completed.\u001b[0m\n",
      "\n",
      "[14:23:58] Blending: optimization starts with equal weights and score \u001b[1m-0.1879588701291192\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/dvladimirvasilyev/anaconda3/envs/myenv/lib/python3.8/site-packages/sklearn/metrics/_classification.py:2916: UserWarning: The y_pred values do not sum to one. Starting from 1.5 thiswill result in an error.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:23:59] Blending: iteration \u001b[1m0\u001b[0m: score = \u001b[1m-0.18573794844833624\u001b[0m, weights = \u001b[1m[0.63928086 0.36071914]\u001b[0m\n",
      "[14:23:59] Blending: iteration \u001b[1m1\u001b[0m: score = \u001b[1m-0.18573794844833624\u001b[0m, weights = \u001b[1m[0.63928086 0.36071914]\u001b[0m\n",
      "[14:23:59] Blending: no score update. Terminated\n",
      "\n",
      "[14:23:59] \u001b[1mAutoml preset training completed in 1167.35 seconds\u001b[0m\n",
      "\n",
      "[14:23:59] Model description:\n",
      "Final prediction for new objects (level 0) = \n",
      "\t 0.63928 * (5 averaged models Lvl_0_Pipe_0_Mod_0_LinearL2) +\n",
      "\t 0.36072 * (5 averaged models Lvl_0_Pipe_1_Mod_0_CatBoost) \n",
      "\n",
      "CPU times: user 18min 40s, sys: 3min 1s, total: 21min 42s\n",
      "Wall time: 19min 27s\n"
     ]
    }
   ],
   "source": [
    "%%time \n",
    "\n",
    "oof_pred = automl.fit_predict(train_data, roles = roles, verbose = 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Сonsider out-of-fold predictions on train data. In case of classification, ```LightAutoML``` returns class probabilities as an output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100330.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100365.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100382.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100632.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>101918.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114472</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114473</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114474</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114475</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114476</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>114477 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          image_id                  label\n",
       "0       100330.jpg  bacterial_leaf_blight\n",
       "1       100365.jpg  bacterial_leaf_blight\n",
       "2       100382.jpg  bacterial_leaf_blight\n",
       "3       100632.jpg  bacterial_leaf_blight\n",
       "4       101918.jpg  bacterial_leaf_blight\n",
       "...            ...                    ...\n",
       "114472  110381.jpg                 tungro\n",
       "114473  110381.jpg                 tungro\n",
       "114474  110381.jpg                 tungro\n",
       "114475  110381.jpg                 tungro\n",
       "114476  110381.jpg                 tungro\n",
       "\n",
       "[114477 rows x 2 columns]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "preds = train_data[['image_id', 'label']]\n",
    "preds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_12895/1432655611.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  preds['pred_' + str(i)] = oof_pred.data[:,i]\n",
      "/tmp/ipykernel_12895/1432655611.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  preds['pred_' + str(i)] = oof_pred.data[:,i]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>pred_0</th>\n",
       "      <th>pred_1</th>\n",
       "      <th>pred_2</th>\n",
       "      <th>pred_3</th>\n",
       "      <th>pred_4</th>\n",
       "      <th>pred_5</th>\n",
       "      <th>pred_6</th>\n",
       "      <th>pred_7</th>\n",
       "      <th>pred_8</th>\n",
       "      <th>pred_9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100330.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>0.023245</td>\n",
       "      <td>0.315283</td>\n",
       "      <td>0.470886</td>\n",
       "      <td>0.002528</td>\n",
       "      <td>0.021895</td>\n",
       "      <td>0.007454</td>\n",
       "      <td>0.001554</td>\n",
       "      <td>0.157142</td>\n",
       "      <td>8.914904e-06</td>\n",
       "      <td>4.559626e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100365.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>0.003717</td>\n",
       "      <td>0.011035</td>\n",
       "      <td>0.028317</td>\n",
       "      <td>0.000110</td>\n",
       "      <td>0.003178</td>\n",
       "      <td>0.000015</td>\n",
       "      <td>0.000131</td>\n",
       "      <td>0.953496</td>\n",
       "      <td>1.555987e-07</td>\n",
       "      <td>5.692390e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100382.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>0.025734</td>\n",
       "      <td>0.095088</td>\n",
       "      <td>0.208473</td>\n",
       "      <td>0.000879</td>\n",
       "      <td>0.007030</td>\n",
       "      <td>0.003382</td>\n",
       "      <td>0.000142</td>\n",
       "      <td>0.659271</td>\n",
       "      <td>3.872871e-07</td>\n",
       "      <td>2.898941e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100632.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>0.002876</td>\n",
       "      <td>0.542942</td>\n",
       "      <td>0.027466</td>\n",
       "      <td>0.000317</td>\n",
       "      <td>0.036005</td>\n",
       "      <td>0.000398</td>\n",
       "      <td>0.000082</td>\n",
       "      <td>0.389901</td>\n",
       "      <td>3.837710e-06</td>\n",
       "      <td>9.339438e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>101918.jpg</td>\n",
       "      <td>bacterial_leaf_blight</td>\n",
       "      <td>0.009988</td>\n",
       "      <td>0.033572</td>\n",
       "      <td>0.017635</td>\n",
       "      <td>0.000032</td>\n",
       "      <td>0.008310</td>\n",
       "      <td>0.000136</td>\n",
       "      <td>0.000041</td>\n",
       "      <td>0.930286</td>\n",
       "      <td>1.554736e-07</td>\n",
       "      <td>1.530466e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114472</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>0.001716</td>\n",
       "      <td>0.109143</td>\n",
       "      <td>0.020722</td>\n",
       "      <td>0.001495</td>\n",
       "      <td>0.845324</td>\n",
       "      <td>0.000177</td>\n",
       "      <td>0.021384</td>\n",
       "      <td>0.000027</td>\n",
       "      <td>6.304998e-06</td>\n",
       "      <td>6.075803e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114473</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>0.022644</td>\n",
       "      <td>0.137650</td>\n",
       "      <td>0.026389</td>\n",
       "      <td>0.004165</td>\n",
       "      <td>0.788036</td>\n",
       "      <td>0.001093</td>\n",
       "      <td>0.019688</td>\n",
       "      <td>0.000259</td>\n",
       "      <td>3.142513e-05</td>\n",
       "      <td>4.477663e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114474</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>0.016897</td>\n",
       "      <td>0.072329</td>\n",
       "      <td>0.010469</td>\n",
       "      <td>0.005554</td>\n",
       "      <td>0.789777</td>\n",
       "      <td>0.001240</td>\n",
       "      <td>0.103631</td>\n",
       "      <td>0.000060</td>\n",
       "      <td>1.301366e-05</td>\n",
       "      <td>2.972130e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114475</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>0.008637</td>\n",
       "      <td>0.114299</td>\n",
       "      <td>0.082281</td>\n",
       "      <td>0.003465</td>\n",
       "      <td>0.560001</td>\n",
       "      <td>0.000741</td>\n",
       "      <td>0.230260</td>\n",
       "      <td>0.000112</td>\n",
       "      <td>1.909918e-04</td>\n",
       "      <td>1.351225e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114476</th>\n",
       "      <td>110381.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>0.004179</td>\n",
       "      <td>0.099988</td>\n",
       "      <td>0.008320</td>\n",
       "      <td>0.004660</td>\n",
       "      <td>0.822037</td>\n",
       "      <td>0.000663</td>\n",
       "      <td>0.059627</td>\n",
       "      <td>0.000318</td>\n",
       "      <td>1.922170e-04</td>\n",
       "      <td>1.441010e-05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>114477 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          image_id                  label    pred_0    pred_1    pred_2  \\\n",
       "0       100330.jpg  bacterial_leaf_blight  0.023245  0.315283  0.470886   \n",
       "1       100365.jpg  bacterial_leaf_blight  0.003717  0.011035  0.028317   \n",
       "2       100382.jpg  bacterial_leaf_blight  0.025734  0.095088  0.208473   \n",
       "3       100632.jpg  bacterial_leaf_blight  0.002876  0.542942  0.027466   \n",
       "4       101918.jpg  bacterial_leaf_blight  0.009988  0.033572  0.017635   \n",
       "...            ...                    ...       ...       ...       ...   \n",
       "114472  110381.jpg                 tungro  0.001716  0.109143  0.020722   \n",
       "114473  110381.jpg                 tungro  0.022644  0.137650  0.026389   \n",
       "114474  110381.jpg                 tungro  0.016897  0.072329  0.010469   \n",
       "114475  110381.jpg                 tungro  0.008637  0.114299  0.082281   \n",
       "114476  110381.jpg                 tungro  0.004179  0.099988  0.008320   \n",
       "\n",
       "          pred_3    pred_4    pred_5    pred_6    pred_7        pred_8  \\\n",
       "0       0.002528  0.021895  0.007454  0.001554  0.157142  8.914904e-06   \n",
       "1       0.000110  0.003178  0.000015  0.000131  0.953496  1.555987e-07   \n",
       "2       0.000879  0.007030  0.003382  0.000142  0.659271  3.872871e-07   \n",
       "3       0.000317  0.036005  0.000398  0.000082  0.389901  3.837710e-06   \n",
       "4       0.000032  0.008310  0.000136  0.000041  0.930286  1.554736e-07   \n",
       "...          ...       ...       ...       ...       ...           ...   \n",
       "114472  0.001495  0.845324  0.000177  0.021384  0.000027  6.304998e-06   \n",
       "114473  0.004165  0.788036  0.001093  0.019688  0.000259  3.142513e-05   \n",
       "114474  0.005554  0.789777  0.001240  0.103631  0.000060  1.301366e-05   \n",
       "114475  0.003465  0.560001  0.000741  0.230260  0.000112  1.909918e-04   \n",
       "114476  0.004660  0.822037  0.000663  0.059627  0.000318  1.922170e-04   \n",
       "\n",
       "              pred_9  \n",
       "0       4.559626e-06  \n",
       "1       5.692390e-07  \n",
       "2       2.898941e-07  \n",
       "3       9.339438e-06  \n",
       "4       1.530466e-07  \n",
       "...              ...  \n",
       "114472  6.075803e-06  \n",
       "114473  4.477663e-05  \n",
       "114474  2.972130e-05  \n",
       "114475  1.351225e-05  \n",
       "114476  1.441010e-05  \n",
       "\n",
       "[114477 rows x 12 columns]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for i in range(10):\n",
    "    preds['pred_' + str(i)] = oof_pred.data[:,i]\n",
    "    \n",
    "preds"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will average forecasts for images by their augmentations:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "      <th>pred_0</th>\n",
       "      <th>pred_1</th>\n",
       "      <th>pred_2</th>\n",
       "      <th>pred_3</th>\n",
       "      <th>pred_4</th>\n",
       "      <th>pred_5</th>\n",
       "      <th>pred_6</th>\n",
       "      <th>pred_7</th>\n",
       "      <th>pred_8</th>\n",
       "      <th>pred_9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001.jpg</td>\n",
       "      <td>brown_spot</td>\n",
       "      <td>0.001334</td>\n",
       "      <td>0.000791</td>\n",
       "      <td>0.002372</td>\n",
       "      <td>5.432664e-03</td>\n",
       "      <td>0.005328</td>\n",
       "      <td>0.978495</td>\n",
       "      <td>0.002519</td>\n",
       "      <td>0.003511</td>\n",
       "      <td>7.897679e-05</td>\n",
       "      <td>1.378119e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002.jpg</td>\n",
       "      <td>normal</td>\n",
       "      <td>0.978428</td>\n",
       "      <td>0.011744</td>\n",
       "      <td>0.001621</td>\n",
       "      <td>3.187062e-03</td>\n",
       "      <td>0.002579</td>\n",
       "      <td>0.000282</td>\n",
       "      <td>0.000156</td>\n",
       "      <td>0.001969</td>\n",
       "      <td>3.391063e-05</td>\n",
       "      <td>1.971700e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003.jpg</td>\n",
       "      <td>hispa</td>\n",
       "      <td>0.004639</td>\n",
       "      <td>0.002192</td>\n",
       "      <td>0.992883</td>\n",
       "      <td>1.573081e-07</td>\n",
       "      <td>0.000026</td>\n",
       "      <td>0.000037</td>\n",
       "      <td>0.000005</td>\n",
       "      <td>0.000218</td>\n",
       "      <td>1.920397e-07</td>\n",
       "      <td>1.528186e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004.jpg</td>\n",
       "      <td>blast</td>\n",
       "      <td>0.000259</td>\n",
       "      <td>0.982406</td>\n",
       "      <td>0.004401</td>\n",
       "      <td>7.787708e-03</td>\n",
       "      <td>0.002372</td>\n",
       "      <td>0.002163</td>\n",
       "      <td>0.000173</td>\n",
       "      <td>0.000115</td>\n",
       "      <td>3.223106e-04</td>\n",
       "      <td>4.848040e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005.jpg</td>\n",
       "      <td>hispa</td>\n",
       "      <td>0.010951</td>\n",
       "      <td>0.047475</td>\n",
       "      <td>0.829855</td>\n",
       "      <td>1.200308e-05</td>\n",
       "      <td>0.091933</td>\n",
       "      <td>0.000418</td>\n",
       "      <td>0.018967</td>\n",
       "      <td>0.000370</td>\n",
       "      <td>1.118553e-05</td>\n",
       "      <td>8.759866e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10402</th>\n",
       "      <td>110403.jpg</td>\n",
       "      <td>tungro</td>\n",
       "      <td>0.001664</td>\n",
       "      <td>0.002167</td>\n",
       "      <td>0.007366</td>\n",
       "      <td>4.507852e-03</td>\n",
       "      <td>0.981122</td>\n",
       "      <td>0.000052</td>\n",
       "      <td>0.001666</td>\n",
       "      <td>0.001455</td>\n",
       "      <td>1.527430e-07</td>\n",
       "      <td>3.928369e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10403</th>\n",
       "      <td>110404.jpg</td>\n",
       "      <td>normal</td>\n",
       "      <td>0.932484</td>\n",
       "      <td>0.002359</td>\n",
       "      <td>0.049850</td>\n",
       "      <td>1.244102e-05</td>\n",
       "      <td>0.011696</td>\n",
       "      <td>0.000593</td>\n",
       "      <td>0.002646</td>\n",
       "      <td>0.000304</td>\n",
       "      <td>4.828784e-05</td>\n",
       "      <td>7.773816e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10404</th>\n",
       "      <td>110405.jpg</td>\n",
       "      <td>dead_heart</td>\n",
       "      <td>0.000192</td>\n",
       "      <td>0.000044</td>\n",
       "      <td>0.000152</td>\n",
       "      <td>9.994839e-01</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>0.000025</td>\n",
       "      <td>0.000058</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>1.957294e-06</td>\n",
       "      <td>3.789358e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10405</th>\n",
       "      <td>110406.jpg</td>\n",
       "      <td>blast</td>\n",
       "      <td>0.000226</td>\n",
       "      <td>0.977683</td>\n",
       "      <td>0.000268</td>\n",
       "      <td>9.254745e-03</td>\n",
       "      <td>0.004962</td>\n",
       "      <td>0.000595</td>\n",
       "      <td>0.004523</td>\n",
       "      <td>0.001717</td>\n",
       "      <td>5.624577e-04</td>\n",
       "      <td>2.080105e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10406</th>\n",
       "      <td>110407.jpg</td>\n",
       "      <td>brown_spot</td>\n",
       "      <td>0.000009</td>\n",
       "      <td>0.000188</td>\n",
       "      <td>0.000539</td>\n",
       "      <td>4.357956e-04</td>\n",
       "      <td>0.000232</td>\n",
       "      <td>0.997215</td>\n",
       "      <td>0.000039</td>\n",
       "      <td>0.000010</td>\n",
       "      <td>1.319862e-03</td>\n",
       "      <td>1.372061e-05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10407 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         image_id       label    pred_0    pred_1    pred_2        pred_3  \\\n",
       "0      100001.jpg  brown_spot  0.001334  0.000791  0.002372  5.432664e-03   \n",
       "1      100002.jpg      normal  0.978428  0.011744  0.001621  3.187062e-03   \n",
       "2      100003.jpg       hispa  0.004639  0.002192  0.992883  1.573081e-07   \n",
       "3      100004.jpg       blast  0.000259  0.982406  0.004401  7.787708e-03   \n",
       "4      100005.jpg       hispa  0.010951  0.047475  0.829855  1.200308e-05   \n",
       "...           ...         ...       ...       ...       ...           ...   \n",
       "10402  110403.jpg      tungro  0.001664  0.002167  0.007366  4.507852e-03   \n",
       "10403  110404.jpg      normal  0.932484  0.002359  0.049850  1.244102e-05   \n",
       "10404  110405.jpg  dead_heart  0.000192  0.000044  0.000152  9.994839e-01   \n",
       "10405  110406.jpg       blast  0.000226  0.977683  0.000268  9.254745e-03   \n",
       "10406  110407.jpg  brown_spot  0.000009  0.000188  0.000539  4.357956e-04   \n",
       "\n",
       "         pred_4    pred_5    pred_6    pred_7        pred_8        pred_9  \n",
       "0      0.005328  0.978495  0.002519  0.003511  7.897679e-05  1.378119e-04  \n",
       "1      0.002579  0.000282  0.000156  0.001969  3.391063e-05  1.971700e-07  \n",
       "2      0.000026  0.000037  0.000005  0.000218  1.920397e-07  1.528186e-07  \n",
       "3      0.002372  0.002163  0.000173  0.000115  3.223106e-04  4.848040e-07  \n",
       "4      0.091933  0.000418  0.018967  0.000370  1.118553e-05  8.759866e-06  \n",
       "...         ...       ...       ...       ...           ...           ...  \n",
       "10402  0.981122  0.000052  0.001666  0.001455  1.527430e-07  3.928369e-07  \n",
       "10403  0.011696  0.000593  0.002646  0.000304  4.828784e-05  7.773816e-06  \n",
       "10404  0.000001  0.000025  0.000058  0.000003  1.957294e-06  3.789358e-05  \n",
       "10405  0.004962  0.000595  0.004523  0.001717  5.624577e-04  2.080105e-04  \n",
       "10406  0.000232  0.997215  0.000039  0.000010  1.319862e-03  1.372061e-05  \n",
       "\n",
       "[10407 rows x 12 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "preds = preds.groupby(['image_id', 'label']).mean().reset_index()\n",
    "preds"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assign classes by maximum class probability:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5, 0, 2, ..., 3, 1, 5])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "OOFs = np.argmax(preds[['pred_' + str(i) for i in range(10)]].values, axis = 1)\n",
    "OOFs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see classification accuracy on train:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Out-of-fold accuracy: 0.9686749303353512\n"
     ]
    }
   ],
   "source": [
    "accuracy = (OOFs == preds['label'].map(automl.reader.target_mapping)).mean()\n",
    "print(f'Out-of-fold accuracy: {accuracy}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Also to estimate the quality of classification, we can use the confusion matrix:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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585Vo0aN5OjoqODgYLVp00bLly9XqVKlzM659PxcVqlSRalTp9aYMWNUtmxZjR07VjNnzoxznE2aNNH169fNku5FixapYsWKsf4As2/fPu3atUuNGzfWpEmT1L59e23atEnlypUzJXhlypRR165dJUlffvml5s+fr/nz5yt37tym45w+fVofffSRKleurIkTJ6pQoUIxnstgMOi7777TkydP1L59e9P6QYMG6fjx45ozZ47c3d1j7ZfBYNB7771nlvwdOXJEDx48kCSz87Bjxw4VLlz4pRO6zZ8/X66uripdurSpL+3atTNr06hRIz169EjBwcFq1KiR5s6dqyFDhsR6vFeZOHGiChcurKFDh2rkyJFycnJSw4YNtXr16hhtt23bpu7du+vjjz/W0KFDdefOHVWtWtXs++XGjRsqUaKENm7cqM6dO2vixInKkSOHWrdurQkTJvxnLPXr19eKFSvUqlUrTZs2TV27dtWjR490+fLl1+obACQIIwAgyVq/fr3R0dHR6OjoaAwKCjJ+/vnnxnXr1hkjIyPN2l28eNHo6OhoHDFihNn6o0ePGp2cnMzWh4WFxXie4OBgo8FgMF66dMm0rkWLFkZJxi5dupjWRUdHG2vUqGF0cXEx3rp1y2g0Go0rV640SjIOHz7c7JgNGjQwGgwG47lz50zrJBkdHByMx48fN2s7Z84coyRjpUqVjNHR0ab1PXr0MDo6Ohrv37//0tfo8OHDRknGbt26vbTNP8U3XhcXF7N1L55v8uTJpnVbtmwxSjIuWbLE7Jhly5Y1li1bNkYMLVq0MGbJksX0uFu3bkYPDw/js2fPXhr3i+fYsmWL0Wg0GiMjI41p06Y15suXzxgeHm5qt2rVKqMk48CBA82eT5Jx6NChZscsXLiwsUiRIi99zn/2I2/evEaj0WgsWrSosXXr1kaj0Wi8d++e0cXFxThv3rxYX4PY3mu7d+82SjJ+//33pnVLliwx69s/ZcmSxSjJuHbt2li3tWjRwmzdN998Y5RkXLBggfGPP/4wOjo6Grt37/7KPn799ddGR0dH48OHD41Go9E4adIkY5YsWYzvvvuusU+fPkaj0WiMiooyenl5GXv06GHab9CgQcZ//3fK3d09Rlz/bPvJJ5+Yra9Xr54xderUr4zx3+8bozHmaxwZGWnMly+fsUKFCmbrJRklGffv329a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/61o0aJKmzatZsyYYdZmzZo1OnnypGrUqJFQ3YihQYMGGjRokKZNmyYXF5eXtnN0dIzxfpw8eXKMEe4Xsyf/OxF+HW3atFF0dLRmz56tmTNnysnJSa1bt47T6Gnp0qUVERGhCRMmqFSpUqbE9cWMy9euXYvT9bvu7u4J0pdXcXR0lMFgMHs9L168qJUrV8bafvfu3WbX4F65ckU///yz3n//fTk6OsrR0VH169fXsmXLYp0Z/r9uERYWFqYnT56YrcuePbtSpkz50vcwAFgCI7wAkIR16dJFYWFhqlevngIDAxUZGaldu3bpp59+kr+/v+m6uuzZs2v48OHq27evLl68qLp16yplypS6cOGCVqxYobZt26pXr14KDAxU9uzZ1atXL129elUeHh5atmzZS68ddHNz09q1a9WiRQsVL15ca9as0erVq/Xll1+aRoRq1aql8uXLq1+/frp48aIKFiyo9evX6+eff1b37t3NJnxKLCVLltTUqVPVsWNHBQYGqlmzZsqZM6cePXqkrVu36pdfftHw4cMtHu8nn3yicePGqUqVKmrdurVu3rypGTNmKG/evGYTFH366ae6e/euKlSooIwZM+rSpUuaPHmyChUqZHZ7nn9ydnbWqFGj1KpVK5UtW1YfffSRbty4YbrVU48ePRKsH//m6empwYMHv7JdzZo1NX/+fHl6eipPnjzavXu3Nm7cqNSpU5u1K1SokBwdHTVq1Cg9ePBArq6uqlChQqy3Ovovc+bM0erVqzV37lxlzJhR0vME++OPP9b06dPVsWPH/9w/KChITk5OOn36tNq2bWtaX6ZMGU2fPl2S4pTwFilSRBs3btS4cePk5+enrFmzqnjx4vHqS1zUqFFD48aNU9WqVdWkSRPdvHlTU6dOVY4cOXTkyJEY7fPly6cqVaqoa9eucnV11bRp0yTJ7JZIX331lbZs2aLixYurTZs2ypMnj+7evas///xTGzdu1N27d2ON5cyZM6pYsaIaNWqkPHnyyMnJSStWrNCNGzfUuHHjBO87AMSZZSeFBgDEx5o1a4yffPKJMTAw0JgiRQqji4uLMUeOHMYuXboYb9y4EaP9smXLjKVKlTK6u7sb3d3djYGBgcZOnToZT58+bWpz4sQJY6VKlYwpUqQw+vj4GNu0aWO61c6LW4wYjc9vgeLu7m48f/688f333zcmT57c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dOvWDWvXrsXVq1c5QzOpxPuEd9++fYI8PxNe9cKEl9QBE14iEhsmvF9HrAlvgSetateuHRwcHHDt2jWsWLECz549Q0BAgDJjIyIiIiIiIvpqBf794/Dhwxg9ejSGDx8OOzs7ZcZEIhYTE/PJaoCoqChYWlqqMCIiIiIiItXQYPGYyhU44T19+jQ2bdqE2rVro2rVqujduzd69OihzNhIhCpUqKAwtje/9Z9S0LG2REREREREBU543dzc4ObmhhUrVmDnzp34+eefMX78eOTk5ODo0aOwsLCAVCpVZqwkAiVKlICtrTjHBxARERERUdFS4DG87+np6WHAgAE4ffo0rl+/jgkTJmDRokUwNTVF+/biv3QGERERERHR15AU4f/E6osT3g85ODhg8eLFePLkCXbs2FFYMRERERERERH9Z/8p4X1PU1MTHTt2xIEDBwpjd0RERERERET/WRG+ShUREREREZF4cJZm1SuUHl4iIiIiIiKiooYJLxEREREREYkSS5qJiIiIiIhUgCXNqsceXiIiIiIiIhIlJrxEREREREQkSixpJiIiIiIiUgGJhDXNqsYeXiIiIiIiIhIlJrxEREREREQkSixpJiIiIiIiUgHO0qx67OElIiIiIiIiUWLCS0RERERERKLEkmYiIiIiIiIV4CTNqsceXiIiIiIiIhIlJrxEREREREQkSixpJiIiIiIiUgEN1jSrHHt4iYiIiIiISJSY8BIREREREZEosaSZiIiIiIhIBTRY0axy7OElIiIiIiIiUWLCS0RERERERKLEkmYiIiIiIiIV4CTNqsceXiIiIiIiIhIlJrxEREREREQkSixpJiIiIiIiUgENsKZZ1ZjwEtHnyYQOQCD8TCI1sOZbZ6FDEMTBm7FChyCIto7lhQ6BiEilWNJMREREREREosQeXiIiIiIiIhXgLM2qxx5eIiIiIiIiEiUmvERERERERCRKLGkmIiIiIiJSAQ2WNKsce3iJiIiIiIhIlJjwEhERERERkSixpJmIiIiIiEgFNDhNs8qxh5eIiIiIiIhEiQkvERERERERiRJLmomIiIiIiFSAFc2qxx5eIiIiIiIiEiUmvERERERERCRKLGkmIiIiIiJSAc7SrHrs4SUiIiIiIiJRYsJLREREREREosSSZiIiIiIiIhVgRbPqsYeXiIiIiIiIRIkJLxEREREREYkS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ISEh8gQ3KSkJ58+fx/DhwwEA7u7uSExMRGRkJGrXrg0AOH78OHJychTm8CkMEpnYLvJG/8mpU6fg6emJx48f56m7J9WXNBcVOTnq+TahoVF0Z1IkKizq+i3gj6hYoUMQRFvH8p/fiKiYK1WEu/R2XXkmdAgf1a1mwYYQRUREoH79+vJLnl64cAGDBw/G+vXr4e3tDSB3JudFixYhKCgIlSpVgq+vL65du4aoqCj5MK1WrVrh+fPnWLt2LTIzM9G/f3+4urpi+/bCvUJFEX45kCqlp6cjISEBs2bNQteuXZnsEhERERFRHnXq1MHevXsxdepUzJkzB5UqVcKKFSvkyS4ATJ48GSkpKRgyZAgSExPRsGFDHDlyRGFOkm3btsHHxweenp7Q0NBAly5d4O/vX+jxsoeXAACBgYEYOHAgatasiQMHDsDc3Fy+btu2bRg6dGi+j7OyssLNm8Xzuolfgz286oU9vKQO1PVbAHt4icSLPbxfp6A9vMUNE176rLdv3+L58+f5rtPS0pLX66sDJrzqhQkvqQN1/RbAhJdIvIpywvtrEU54u4o04S3CLwcqKqRSKaRSqdBhEBERERERfZGifCkoIiIiIiIioq/GHl4iIiIiIiIVkEg4XErV2MNLREREREREosSEl4iIiIiIiESJJc1EREREREQqwN5G1eMxJyIiIiIiIlFiwktERERERESixJJmIiIiIiIiFeAszarHHl4iIiIiIiISJSa8REREREREJEosaSYiIiIiIlIBFjSrHnt4iYiIiIiISJSY8BIREREREZEosaSZiIiIiIhIBThJs+qxh5eIiIiIiIhEiQkvERERERERiRJLmomIiIiIiFRAg/M0qxx7eImIiIiIiEiUmPASERERERGRKLGkmYiIiIiISAU4S7PqsYeXiIiIiIiIRIkJLxEREREREYkSS5qJiIiIiIhUQMJZmlWOPbxEREREREQkSkx4iYiIiIiISJRY0kxERERERKQCnKVZ9djDS0RERERERKLEhJeIiIiIiIhEiSXNRPRZEtbfEImWuv55t3UsL3QIgoi4/1roEARRx6a00CEQAQA0OEuzyrGHl4iIiIiIiESJCS8RERERERGJEkuaiYiIiIiIVEBdh5EIiT28REREREREJEpMeImIiIiIiEiUWNJMRERERESkAixpVj328BIREREREZEoMeEl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euL69eu4cuWK/Obq6gpvb2/5v7W0tBASEiJ/zO3btxETEwN3d3cAgLu7O65fv474+Hj5NkePHoWBgQGqVatWqPGypJmIiIiIiIgKRCqVonr16grL9PT0YGJiIl8+cOBAjB8/HsbGxjAwMMCoUaPg7u4ONzc3AECLFi1QrVo19O7dG4sXL0ZcXBymT5+OkSNH5tur/F8w4SUiIiIiIlIBCSRCh6ASy5cvh4aGBrp06YL09HR4eXlh9erV8vWampo4ePAghg8fDnd3d+jp6aFv376YM2dOoccikclkskLfK5FIpWUJHYEw1PVdQqIen0lEpEYi7r8WOgRB1LEp/fmNSDRKFeEuvYsPkoQO4aNcKxkIHYJScAwvERERERERiVIR/v2DiIiIiIhIPFg9pnrs4SUiIiIiIiJRYsJLREREREREosSSZiIiIiIiIhVgRbPqsYeXiIiIiIiIRIkJLxEREREREYkSS5qJiIiIiIhUgTXNKsceXiIiIiIiIhIlJrxEREREREQkSixpJiIiIiIiUgEJa5pVjj28REREREREJEpMeImIiIiIiEiUWNJMRERERESkAhJWNKsce3iJiIiIiIhIlJjwEhERERERkSixpJmIiIiIiEgFWNGseuzhJSIiIiIiIlFiDy8RfRYnWCAiEoc6NqWFDkEQUU+ShA5BENUqGggdApHgmPASERERERGpAjsRVI4lzURERERERCRKTHiJiIiIiIhIlFjSTEREREREpAIS1jSrHHt4iYiIiIiISJSY8BIREREREZEosaSZiIiIiIhIBXipR9VjDy8RERERERGJEhNeIiIiIiIiEiWWNBMREREREakAK5pVjz28REREREREJEpMeImIiIiIiEiUWNJMRERERESkCqxpVjn28BIREREREZEoMeElIiIiIiIiUWJJMxERERERkQpIWNOscuzhJSIiIiIiIlFiwktERERERESixJJmIiIiIiIiFZCwolnl2MNLREREREREosSEl4iIiIiIiESJJc1EREREREQqwIpm1WMPLxEREREREYkSE14iIiIiIiISJZY0ExERERERqQJrmlWOPbxEREREREQkSkx4iYiIiIiISJRY0kxERERERKQCEtY0qxx7eImIiIiIiEiUmPASERERERGRKLGkmYiIiIiISAUkrGhWOfbwEhERERERkSiJKuH18PDA2LFj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ftjDS0RERERERKLEhJeIiIiIiIhEiSXNREREREREKsCKZtVjDy8RERERERGJEhNeIiIiIiIiEiWWNBMREREREakCa5pVjj28REREREREJEpMeImIiIiIiEiUWNJMRERERESkAhLWNKsce3iJiIiIiIhIlJjwEhERERERkSixpJmIiIiIiEgFJKxoVjn28BIREREREZEoMeElIiIiIiIiUWJJMxERERERkQqwoln12MNLREREREREosSEl4iIiIiIiESJJc1ERERERESqwJpmlWMPLxEREREREYkSE14iIiIiIiISJZY0ExERERERqYCENc0qxx5eIiIiIiIiEiUmvERERERERPRFVq1aBWtra5QqVQr16tXDhQsXhA4pX0x4iYiIiIiIVEAiKbq3L7Fz506MHz8eM2fOxKVLl1CjRg14eXkhPj5eOQfuP5DIZDKZ0EEQFRdpWUJHQERERFQwf8cmCx2CIJwt9IUO4aOK8nfJUl8wu1O9evVQp04d/PTTTwCAnJwcWFhYYNSoUfj++++VFOHXYQ8vERERERGRmktPT0dSUpLCLT09Pc92GRkZiIyMRPPmzeXLNDQ00Lx5c4SHh6sy5IKREVGRl5aWJps5c6YsLS1N6FBUiu1mu9UB2812qwO2m+2mom/mzJkyAAq3mTNn5tnu6dOnMgCys2fPKiyfNGmSrG7duiqKtuBY0kxUDCQlJcHQ0BBv3ryBgYGB0OGoDNvNdqsDtpvtVgdsN9tNRV96enqeHt2SJUuiZMmSCsuePXsGc3NznD17Fu7u7vLlkydPRlhYGM6fP6+SeAuK1+ElIiIiIiJSc/klt/kpU6YMNDU18fz5c4Xlz58/h5mZmbLC+2ocw0tEREREREQFoq2tjdq1ayMkJES+LCcnByEhIQo9vkUFe3iJiIiIiIiowMaPH4++ffvC1dUVdevWxYoVK5CSkoL+/fsLHVoeTHiJioGSJUti5syZBSozERO2m+1WB2w3260O2G62m8Sle/fuSEhIwIwZMxAXF4eaNWviyJEjKFeunNCh5cFJq4iIiIiIiEiUOIaXiIiIiIiIRIkJLxEREREREYkSE14iIiIiIiISJSa8REREREREJEpMeImIiIiIiEiUmPASERERKVFaWprQIRARqS0mvEREJJgBAwbg7du3eZanpKRgwIABAkSkejKZDLxCoLgZGRmh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b94EALi7uyMnJ0dkNNJiLHiJiIiIiOiZubq64sKFCwCAbt26YdWqVbh69SoSEhLQpk0bwelIW/FYIiIiIiIiemZfffUVlEolxowZg1OnTiEgIAC3b9+GgYEBUlJSEBwcLDoiaSEWvERERERE1KxUKhUePHiA8+fPw8HBAa1btxYdibQUW5qJiIiIiKhZrFmzBl27doWRkRGsra0RFhaGtLQ00bFIi3GXZiIiIiIiemYxMTGIi4tDZGQk+vTpAwA4evQopk2bhtLSUsybN09wQtJGbGkmIiIiIqJnZmtri/j4eIwYMUJjPDU1FZGRkbh165agZKTN2NJMRERERETPrL6+Hl5eXk3Ge/ToAaVSKSAREQteIiIiIiJqBqGhoVi5cmWT8dWrVyMkJERAIiKu4SUiIiIioj8pOjpa/bVCoUBiYiL27NmD3r17AwCys7NRWlqKsLAwURFJy3ENLxERERER/Sn+/v5PdZ9CoUB6errEaYiaYsFLREREREREssQ1vERERERERCRLLHiJiIiIiIhIlljwEhERERERkSyx4CUiIiIiIiJZYsFLREREREREssSCl4iIiIiIiGSJBS8RERERERHJEgteIiIiIiIikiUWvERERERERCRLLHiJiIiIiIhIlljwEhERERERkSyx4CUiIiIiIiJZYsFLREREREREssSCl4iIiIiIiGSJBS8RERERERHJEgteIiIiIiIikiUWvERERERERCRLLHiJiIiIiIhIlljwEhERERERkSyx4CUiIiIiIiJZYsFLRET0nBgzZgzeeust9fd+fn6YOnVqi+fIyMiAQqHA3bt3JX0ehUKBtLQ0SZ+DiIi0GwteIiKi3zFmzBgoFAooFAoYGBjA2dkZ8+bNg1KplPy5t27divnz5z/VvS1VpNbV1aF169ZYtGjRY6/Pnz8fL7zwAurr6yXNQURE9DRY8BIREf2BgIAAlJWVobCwEB988AHmzp2LJUuWPPbeurq6ZnteGxsbmJubN9vjNQcDAwOMGjUKSUlJTa6pVCokJycjLCwM+vr6AtIRERFpYsFLRET0BwwNDfG3v/0Njo6OeO+99zBgwABs374dwP+1If/rX/9C27Zt4erqCgD4+eefMXz4cFhZWcHGxgZDhgzB5cuX1Y/Z0NCA6OhoWFlZoVWrVvjHP/4BlUql8by/bWmura3FzJkz0a5d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",
      "text/plain": [
       "<Figure size 1000x1000 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cf_matrix = confusion_matrix(preds['label'].map(automl.reader.target_mapping), \n",
    "                             OOFs)\n",
    "\n",
    "plt.figure(figsize = (10, 10))\n",
    "\n",
    "ax = sns.heatmap(cf_matrix, annot=True, cmap='Blues', fmt = 'd')\n",
    "\n",
    "ax.set_title('Seaborn Confusion Matrix with labels\\n\\n');\n",
    "ax.set_xlabel('\\nPredicted Values')\n",
    "ax.set_ylabel('Actual Values ');\n",
    "\n",
    "inverse_target_mapping = {y: x for x,y in automl.reader.target_mapping.items()}\n",
    "labels = [inverse_target_mapping[i] for i in range(len(inverse_target_mapping))]\n",
    "ax.xaxis.set_ticklabels(labels, rotation = 90)\n",
    "ax.yaxis.set_ticklabels(labels, rotation = 0)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predict for test dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Now we are also ready to predict for our test competition dataset and submission file creation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-06-09T09:09:32.435193Z",
     "iopub.status.busy": "2022-06-09T09:09:32.433387Z",
     "iopub.status.idle": "2022-06-09T09:09:32.938864Z",
     "shell.execute_reply": "2022-06-09T09:09:32.937616Z",
     "shell.execute_reply.started": "2022-06-09T09:09:32.435125Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 163/163 [01:28<00:00,  1.84it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:28:22] Feature path transformed\n",
      "Prediction for te_data:\n",
      "array([[1.57098308e-01, 2.81519257e-03, 5.96348643e-01, ...,\n",
      "        1.08084995e-02, 1.95845146e-07, 1.42198633e-05],\n",
      "       [9.83384371e-01, 6.52049668e-04, 1.45791359e-02, ...,\n",
      "        1.12365209e-03, 9.75986836e-07, 1.95965598e-07],\n",
      "       [1.68020770e-01, 3.79674375e-01, 1.86414778e-01, ...,\n",
      "        1.67078048e-03, 1.21877249e-03, 3.75247910e-03],\n",
      "       ...,\n",
      "       [1.05072348e-03, 1.24680300e-05, 5.70231769e-03, ...,\n",
      "        4.37476301e-05, 1.52421890e-07, 1.81421214e-07],\n",
      "       [6.52685121e-04, 4.47798493e-06, 5.04824053e-03, ...,\n",
      "        2.13344283e-05, 1.52417726e-07, 1.62638599e-07],\n",
      "       [1.57185504e-03, 1.01540554e-05, 2.53849756e-02, ...,\n",
      "        1.17763964e-04, 1.52426963e-07, 1.77946404e-07]], dtype=float32)\n",
      "Shape = (20814, 10)\n",
      "CPU times: user 55.8 s, sys: 21.6 s, total: 1min 17s\n",
      "Wall time: 2min 19s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "te_pred = automl.predict(submission)\n",
    "print(f'Prediction for te_data:\\n{te_pred}\\nShape = {te_pred.shape}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_12895/1185757098.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  sub['pred_' + str(i)] = te_pred.data[:,i]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>pred_0</th>\n",
       "      <th>pred_1</th>\n",
       "      <th>pred_2</th>\n",
       "      <th>pred_3</th>\n",
       "      <th>pred_4</th>\n",
       "      <th>pred_5</th>\n",
       "      <th>pred_6</th>\n",
       "      <th>pred_7</th>\n",
       "      <th>pred_8</th>\n",
       "      <th>pred_9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200001.jpg</td>\n",
       "      <td>0.157098</td>\n",
       "      <td>0.002815</td>\n",
       "      <td>0.596349</td>\n",
       "      <td>0.020590</td>\n",
       "      <td>1.148577e-01</td>\n",
       "      <td>0.095614</td>\n",
       "      <td>0.001854</td>\n",
       "      <td>0.010808</td>\n",
       "      <td>1.958451e-07</td>\n",
       "      <td>1.421986e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200002.jpg</td>\n",
       "      <td>0.983384</td>\n",
       "      <td>0.000652</td>\n",
       "      <td>0.014579</td>\n",
       "      <td>0.000139</td>\n",
       "      <td>6.825896e-05</td>\n",
       "      <td>0.000044</td>\n",
       "      <td>0.000008</td>\n",
       "      <td>0.001124</td>\n",
       "      <td>9.759868e-07</td>\n",
       "      <td>1.959656e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>200003.jpg</td>\n",
       "      <td>0.168021</td>\n",
       "      <td>0.379674</td>\n",
       "      <td>0.186415</td>\n",
       "      <td>0.000225</td>\n",
       "      <td>1.850213e-03</td>\n",
       "      <td>0.036919</td>\n",
       "      <td>0.220253</td>\n",
       "      <td>0.001671</td>\n",
       "      <td>1.218772e-03</td>\n",
       "      <td>3.752479e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>200004.jpg</td>\n",
       "      <td>0.000013</td>\n",
       "      <td>0.990730</td>\n",
       "      <td>0.008530</td>\n",
       "      <td>0.000097</td>\n",
       "      <td>1.116415e-04</td>\n",
       "      <td>0.000215</td>\n",
       "      <td>0.000111</td>\n",
       "      <td>0.000037</td>\n",
       "      <td>1.548404e-04</td>\n",
       "      <td>1.946677e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>200005.jpg</td>\n",
       "      <td>0.000340</td>\n",
       "      <td>0.999536</td>\n",
       "      <td>0.000031</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>6.857538e-07</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>0.000007</td>\n",
       "      <td>0.000029</td>\n",
       "      <td>5.404088e-07</td>\n",
       "      <td>4.985940e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20809</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>0.003061</td>\n",
       "      <td>0.000017</td>\n",
       "      <td>0.041731</td>\n",
       "      <td>0.943745</td>\n",
       "      <td>1.648944e-04</td>\n",
       "      <td>0.010877</td>\n",
       "      <td>0.000146</td>\n",
       "      <td>0.000258</td>\n",
       "      <td>1.524480e-07</td>\n",
       "      <td>2.509265e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20810</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>0.000430</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>0.002508</td>\n",
       "      <td>0.993409</td>\n",
       "      <td>2.613632e-05</td>\n",
       "      <td>0.003580</td>\n",
       "      <td>0.000007</td>\n",
       "      <td>0.000036</td>\n",
       "      <td>1.524176e-07</td>\n",
       "      <td>1.595918e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20811</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>0.001051</td>\n",
       "      <td>0.000012</td>\n",
       "      <td>0.005702</td>\n",
       "      <td>0.989972</td>\n",
       "      <td>5.734707e-05</td>\n",
       "      <td>0.003144</td>\n",
       "      <td>0.000018</td>\n",
       "      <td>0.000044</td>\n",
       "      <td>1.524219e-07</td>\n",
       "      <td>1.814212e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20812</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>0.000653</td>\n",
       "      <td>0.000004</td>\n",
       "      <td>0.005048</td>\n",
       "      <td>0.990724</td>\n",
       "      <td>3.223727e-05</td>\n",
       "      <td>0.003505</td>\n",
       "      <td>0.000012</td>\n",
       "      <td>0.000021</td>\n",
       "      <td>1.524177e-07</td>\n",
       "      <td>1.626386e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20813</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>0.001572</td>\n",
       "      <td>0.000010</td>\n",
       "      <td>0.025385</td>\n",
       "      <td>0.965282</td>\n",
       "      <td>1.030424e-04</td>\n",
       "      <td>0.007472</td>\n",
       "      <td>0.000058</td>\n",
       "      <td>0.000118</td>\n",
       "      <td>1.524270e-07</td>\n",
       "      <td>1.779464e-07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>20814 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         image_id    pred_0    pred_1    pred_2    pred_3        pred_4  \\\n",
       "0      200001.jpg  0.157098  0.002815  0.596349  0.020590  1.148577e-01   \n",
       "1      200002.jpg  0.983384  0.000652  0.014579  0.000139  6.825896e-05   \n",
       "2      200003.jpg  0.168021  0.379674  0.186415  0.000225  1.850213e-03   \n",
       "3      200004.jpg  0.000013  0.990730  0.008530  0.000097  1.116415e-04   \n",
       "4      200005.jpg  0.000340  0.999536  0.000031  0.000002  6.857538e-07   \n",
       "...           ...       ...       ...       ...       ...           ...   \n",
       "20809  203469.jpg  0.003061  0.000017  0.041731  0.943745  1.648944e-04   \n",
       "20810  203469.jpg  0.000430  0.000003  0.002508  0.993409  2.613632e-05   \n",
       "20811  203469.jpg  0.001051  0.000012  0.005702  0.989972  5.734707e-05   \n",
       "20812  203469.jpg  0.000653  0.000004  0.005048  0.990724  3.223727e-05   \n",
       "20813  203469.jpg  0.001572  0.000010  0.025385  0.965282  1.030424e-04   \n",
       "\n",
       "         pred_5    pred_6    pred_7        pred_8        pred_9  \n",
       "0      0.095614  0.001854  0.010808  1.958451e-07  1.421986e-05  \n",
       "1      0.000044  0.000008  0.001124  9.759868e-07  1.959656e-07  \n",
       "2      0.036919  0.220253  0.001671  1.218772e-03  3.752479e-03  \n",
       "3      0.000215  0.000111  0.000037  1.548404e-04  1.946677e-07  \n",
       "4      0.000003  0.000007  0.000029  5.404088e-07  4.985940e-05  \n",
       "...         ...       ...       ...           ...           ...  \n",
       "20809  0.010877  0.000146  0.000258  1.524480e-07  2.509265e-07  \n",
       "20810  0.003580  0.000007  0.000036  1.524176e-07  1.595918e-07  \n",
       "20811  0.003144  0.000018  0.000044  1.524219e-07  1.814212e-07  \n",
       "20812  0.003505  0.000012  0.000021  1.524177e-07  1.626386e-07  \n",
       "20813  0.007472  0.000058  0.000118  1.524270e-07  1.779464e-07  \n",
       "\n",
       "[20814 rows x 11 columns]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub = submission[['image_id']]\n",
    "for i in range(10):\n",
    "    sub['pred_' + str(i)] = te_pred.data[:,i]\n",
    "    \n",
    "sub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>pred_0</th>\n",
       "      <th>pred_1</th>\n",
       "      <th>pred_2</th>\n",
       "      <th>pred_3</th>\n",
       "      <th>pred_4</th>\n",
       "      <th>pred_5</th>\n",
       "      <th>pred_6</th>\n",
       "      <th>pred_7</th>\n",
       "      <th>pred_8</th>\n",
       "      <th>pred_9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200001.jpg</td>\n",
       "      <td>0.127650</td>\n",
       "      <td>0.001409</td>\n",
       "      <td>0.599914</td>\n",
       "      <td>0.017568</td>\n",
       "      <td>0.136898</td>\n",
       "      <td>0.106915</td>\n",
       "      <td>0.001796</td>\n",
       "      <td>0.007829</td>\n",
       "      <td>8.801418e-06</td>\n",
       "      <td>1.216593e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200002.jpg</td>\n",
       "      <td>0.937035</td>\n",
       "      <td>0.000638</td>\n",
       "      <td>0.060420</td>\n",
       "      <td>0.000098</td>\n",
       "      <td>0.000105</td>\n",
       "      <td>0.000096</td>\n",
       "      <td>0.000016</td>\n",
       "      <td>0.001586</td>\n",
       "      <td>6.087082e-06</td>\n",
       "      <td>2.249314e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>200003.jpg</td>\n",
       "      <td>0.120163</td>\n",
       "      <td>0.523312</td>\n",
       "      <td>0.106169</td>\n",
       "      <td>0.000473</td>\n",
       "      <td>0.000748</td>\n",
       "      <td>0.042688</td>\n",
       "      <td>0.201373</td>\n",
       "      <td>0.002807</td>\n",
       "      <td>1.389023e-03</td>\n",
       "      <td>8.788786e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>200004.jpg</td>\n",
       "      <td>0.000020</td>\n",
       "      <td>0.888623</td>\n",
       "      <td>0.006415</td>\n",
       "      <td>0.001150</td>\n",
       "      <td>0.000430</td>\n",
       "      <td>0.004390</td>\n",
       "      <td>0.000616</td>\n",
       "      <td>0.001799</td>\n",
       "      <td>9.654120e-02</td>\n",
       "      <td>1.466518e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>200005.jpg</td>\n",
       "      <td>0.000680</td>\n",
       "      <td>0.998898</td>\n",
       "      <td>0.000085</td>\n",
       "      <td>0.000009</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.000021</td>\n",
       "      <td>0.000172</td>\n",
       "      <td>1.743805e-06</td>\n",
       "      <td>1.304403e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3464</th>\n",
       "      <td>203465.jpg</td>\n",
       "      <td>0.000224</td>\n",
       "      <td>0.002143</td>\n",
       "      <td>0.001514</td>\n",
       "      <td>0.990281</td>\n",
       "      <td>0.002657</td>\n",
       "      <td>0.000401</td>\n",
       "      <td>0.001074</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>1.530934e-03</td>\n",
       "      <td>4.091801e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3465</th>\n",
       "      <td>203466.jpg</td>\n",
       "      <td>0.250769</td>\n",
       "      <td>0.007148</td>\n",
       "      <td>0.741840</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.000022</td>\n",
       "      <td>0.000013</td>\n",
       "      <td>0.000076</td>\n",
       "      <td>0.000129</td>\n",
       "      <td>2.629060e-07</td>\n",
       "      <td>2.120279e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3466</th>\n",
       "      <td>203467.jpg</td>\n",
       "      <td>0.960745</td>\n",
       "      <td>0.004105</td>\n",
       "      <td>0.001135</td>\n",
       "      <td>0.000646</td>\n",
       "      <td>0.016724</td>\n",
       "      <td>0.008584</td>\n",
       "      <td>0.000062</td>\n",
       "      <td>0.007749</td>\n",
       "      <td>2.438365e-04</td>\n",
       "      <td>6.326832e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3467</th>\n",
       "      <td>203468.jpg</td>\n",
       "      <td>0.003675</td>\n",
       "      <td>0.001097</td>\n",
       "      <td>0.038018</td>\n",
       "      <td>0.000038</td>\n",
       "      <td>0.000483</td>\n",
       "      <td>0.000310</td>\n",
       "      <td>0.000223</td>\n",
       "      <td>0.000208</td>\n",
       "      <td>9.551883e-01</td>\n",
       "      <td>7.596347e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3468</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>0.001372</td>\n",
       "      <td>0.000012</td>\n",
       "      <td>0.015432</td>\n",
       "      <td>0.977533</td>\n",
       "      <td>0.000086</td>\n",
       "      <td>0.005415</td>\n",
       "      <td>0.000046</td>\n",
       "      <td>0.000104</td>\n",
       "      <td>1.524300e-07</td>\n",
       "      <td>1.962799e-07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3469 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        image_id    pred_0    pred_1    pred_2    pred_3    pred_4    pred_5  \\\n",
       "0     200001.jpg  0.127650  0.001409  0.599914  0.017568  0.136898  0.106915   \n",
       "1     200002.jpg  0.937035  0.000638  0.060420  0.000098  0.000105  0.000096   \n",
       "2     200003.jpg  0.120163  0.523312  0.106169  0.000473  0.000748  0.042688   \n",
       "3     200004.jpg  0.000020  0.888623  0.006415  0.001150  0.000430  0.004390   \n",
       "4     200005.jpg  0.000680  0.998898  0.000085  0.000009  0.000001  0.000002   \n",
       "...          ...       ...       ...       ...       ...       ...       ...   \n",
       "3464  203465.jpg  0.000224  0.002143  0.001514  0.990281  0.002657  0.000401   \n",
       "3465  203466.jpg  0.250769  0.007148  0.741840  0.000002  0.000022  0.000013   \n",
       "3466  203467.jpg  0.960745  0.004105  0.001135  0.000646  0.016724  0.008584   \n",
       "3467  203468.jpg  0.003675  0.001097  0.038018  0.000038  0.000483  0.000310   \n",
       "3468  203469.jpg  0.001372  0.000012  0.015432  0.977533  0.000086  0.005415   \n",
       "\n",
       "        pred_6    pred_7        pred_8        pred_9  \n",
       "0     0.001796  0.007829  8.801418e-06  1.216593e-05  \n",
       "1     0.000016  0.001586  6.087082e-06  2.249314e-07  \n",
       "2     0.201373  0.002807  1.389023e-03  8.788786e-04  \n",
       "3     0.000616  0.001799  9.654120e-02  1.466518e-05  \n",
       "4     0.000021  0.000172  1.743805e-06  1.304403e-04  \n",
       "...        ...       ...           ...           ...  \n",
       "3464  0.001074  0.000134  1.530934e-03  4.091801e-05  \n",
       "3465  0.000076  0.000129  2.629060e-07  2.120279e-07  \n",
       "3466  0.000062  0.007749  2.438365e-04  6.326832e-06  \n",
       "3467  0.000223  0.000208  9.551883e-01  7.596347e-04  \n",
       "3468  0.000046  0.000104  1.524300e-07  1.962799e-07  \n",
       "\n",
       "[3469 rows x 11 columns]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub = sub.groupby(['image_id']).mean().reset_index()\n",
    "sub"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0                       hispa\n",
       "1                      normal\n",
       "2                       blast\n",
       "3                       blast\n",
       "4                       blast\n",
       "                ...          \n",
       "3464               dead_heart\n",
       "3465                    hispa\n",
       "3466                   normal\n",
       "3467    bacterial_leaf_streak\n",
       "3468               dead_heart\n",
       "Length: 3469, dtype: object"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "TEs = pd.Series(np.argmax(sub[['pred_' + str(i) for i in range(10)]].values, axis = 1)).map(inverse_target_mapping)\n",
    "TEs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-06-09T09:09:41.251065Z",
     "iopub.status.busy": "2022-06-09T09:09:41.248709Z",
     "iopub.status.idle": "2022-06-09T09:09:41.295972Z",
     "shell.execute_reply": "2022-06-09T09:09:41.295126Z",
     "shell.execute_reply.started": "2022-06-09T09:09:41.251007Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>image_id</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200001.jpg</td>\n",
       "      <td>hispa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200002.jpg</td>\n",
       "      <td>normal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>200003.jpg</td>\n",
       "      <td>blast</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>200004.jpg</td>\n",
       "      <td>blast</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>200005.jpg</td>\n",
       "      <td>blast</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3464</th>\n",
       "      <td>203465.jpg</td>\n",
       "      <td>dead_heart</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3465</th>\n",
       "      <td>203466.jpg</td>\n",
       "      <td>hispa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3466</th>\n",
       "      <td>203467.jpg</td>\n",
       "      <td>normal</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3467</th>\n",
       "      <td>203468.jpg</td>\n",
       "      <td>bacterial_leaf_streak</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3468</th>\n",
       "      <td>203469.jpg</td>\n",
       "      <td>dead_heart</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3469 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        image_id                  label\n",
       "0     200001.jpg                  hispa\n",
       "1     200002.jpg                 normal\n",
       "2     200003.jpg                  blast\n",
       "3     200004.jpg                  blast\n",
       "4     200005.jpg                  blast\n",
       "...          ...                    ...\n",
       "3464  203465.jpg             dead_heart\n",
       "3465  203466.jpg                  hispa\n",
       "3466  203467.jpg                 normal\n",
       "3467  203468.jpg  bacterial_leaf_streak\n",
       "3468  203469.jpg             dead_heart\n",
       "\n",
       "[3469 rows x 2 columns]"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub['label'] = TEs\n",
    "sub[['image_id', 'label']].to_csv('LightAutoML_TabularCVAutoML_with_aug.csv', index = False)\n",
    "sub[['image_id', 'label']]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Now we can choose another model from ```timm```. So we will use ```tf_efficientnetv2_b0.in1k```, by default it uses ```vit_base_patch16_224.augreg_in21k```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "automl = TabularCVAutoML(task = task,\n",
    "                         timeout=5 * 3600,\n",
    "                         autocv_features={\"embed_model\": 'timm/tf_efficientnetv2_b0.in1k'},\n",
    "                        cpu_limit = 2,\n",
    "                        reader_params = {'cv': 5, 'random_state': 42})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:37:43] Stdout logging level is INFO3.\n",
      "[14:37:43] Task: multiclass\n",
      "\n",
      "[14:37:43] Start automl preset with listed constraints:\n",
      "[14:37:43] - time: 18000.00 seconds\n",
      "[14:37:43] - CPU: 2 cores\n",
      "[14:37:43] - memory: 16 GB\n",
      "\n",
      "[14:37:43] \u001b[1mTrain data shape: (114477, 5)\u001b[0m\n",
      "\n",
      "[14:37:43] Layer \u001b[1m1\u001b[0m train process start. Time left 17999.80 secs\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2795cb31118c42a8a3c0753468f54c4a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Downloading model.safetensors:   0%|          | 0.00/28.8M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 895/895 [06:43<00:00,  2.22it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:44:31] Feature path transformed\n",
      "[14:44:41] Start fitting \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m ...\n",
      "[14:44:41] ===== Start working with \u001b[1mfold 0\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:44:53] Linear model: C = 1e-05 score = -1.2282992628176856\n",
      "[14:45:04] Linear model: C = 5e-05 score = -0.9078946864858105\n",
      "[14:45:14] Linear model: C = 0.0001 score = -0.7903223383077203\n",
      "[14:45:25] Linear model: C = 0.0005 score = -0.5805263796419443\n",
      "[14:45:37] Linear model: C = 0.001 score = -0.5191830537228186\n",
      "[14:45:48] Linear model: C = 0.005 score = -0.44237800607788724\n",
      "[14:46:01] Linear model: C = 0.01 score = -0.4332587963951451\n",
      "[14:46:16] Linear model: C = 0.05 score = -0.4659824021930572\n",
      "[14:46:28] Linear model: C = 0.1 score = -0.49696980356910764\n",
      "[14:46:29] ===== Start working with \u001b[1mfold 1\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:46:40] Linear model: C = 1e-05 score = -1.1941203869888553\n",
      "[14:46:50] Linear model: C = 5e-05 score = -0.870315687726058\n",
      "[14:47:00] Linear model: C = 0.0001 score = -0.7542737074009194\n",
      "[14:47:11] Linear model: C = 0.0005 score = -0.5565397834768919\n",
      "[14:47:23] Linear model: C = 0.001 score = -0.5021799803891854\n",
      "[14:47:37] Linear model: C = 0.005 score = -0.4375446715586552\n",
      "[14:47:49] Linear model: C = 0.01 score = -0.4337117229695793\n",
      "[14:48:03] Linear model: C = 0.05 score = -0.47678539878379567\n",
      "[14:48:16] Linear model: C = 0.1 score = -0.5100193461879381\n",
      "[14:48:16] ===== Start working with \u001b[1mfold 2\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:48:27] Linear model: C = 1e-05 score = -1.1828501053814764\n",
      "[14:48:39] Linear model: C = 5e-05 score = -0.8603329618510173\n",
      "[14:48:48] Linear model: C = 0.0001 score = -0.7451147263666518\n",
      "[14:48:59] Linear model: C = 0.0005 score = -0.5469582228988039\n",
      "[14:49:12] Linear model: C = 0.001 score = -0.49160247842297417\n",
      "[14:49:24] Linear model: C = 0.005 score = -0.4257572256164155\n",
      "[14:49:37] Linear model: C = 0.01 score = -0.4188241529929714\n",
      "[14:49:50] Linear model: C = 0.05 score = -0.4522382557188784\n",
      "[14:50:03] Linear model: C = 0.1 score = -0.48277984079191094\n",
      "[14:50:04] ===== Start working with \u001b[1mfold 3\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:50:15] Linear model: C = 1e-05 score = -1.1958343845422246\n",
      "[14:50:26] Linear model: C = 5e-05 score = -0.878725101433787\n",
      "[14:50:35] Linear model: C = 0.0001 score = -0.7660166437189271\n",
      "[14:50:45] Linear model: C = 0.0005 score = -0.5679153687919936\n",
      "[14:50:59] Linear model: C = 0.001 score = -0.5110457138416219\n",
      "[14:51:10] Linear model: C = 0.005 score = -0.44229320617124224\n",
      "[14:51:23] Linear model: C = 0.01 score = -0.43663952743918066\n",
      "[14:51:37] Linear model: C = 0.05 score = -0.47363171137894655\n",
      "[14:51:51] Linear model: C = 0.1 score = -0.5032655687259646\n",
      "[14:51:51] ===== Start working with \u001b[1mfold 4\u001b[0m for \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m =====\n",
      "[14:52:02] Linear model: C = 1e-05 score = -1.1804715353776323\n",
      "[14:52:13] Linear model: C = 5e-05 score = -0.8529105474280552\n",
      "[14:52:21] Linear model: C = 0.0001 score = -0.7373622302487922\n",
      "[14:52:32] Linear model: C = 0.0005 score = -0.537561225715503\n",
      "[14:52:43] Linear model: C = 0.001 score = -0.48106564988541606\n",
      "[14:52:57] Linear model: C = 0.005 score = -0.4138154861612588\n",
      "[14:53:09] Linear model: C = 0.01 score = -0.40990101492044817\n",
      "[14:53:23] Linear model: C = 0.05 score = -0.44904189928940963\n",
      "[14:53:36] Linear model: C = 0.1 score = -0.4789966864522385\n",
      "[14:53:36] Fitting \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m finished. score = \u001b[1m-0.4264683916927181\u001b[0m\n",
      "[14:53:36] \u001b[1mLvl_0_Pipe_0_Mod_0_LinearL2\u001b[0m fitting and predicting completed\n",
      "[14:53:36] Time left 17046.53 secs\n",
      "\n",
      "[14:58:02] Start fitting \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m ...\n",
      "[14:58:02] ===== Start working with \u001b[1mfold 0\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:58:02] 0:\tlearn: 2.2636799\ttest: 2.2649651\tbest: 2.2649651 (0)\ttotal: 10.4ms\tremaining: 41.6s\n",
      "[14:58:22] bestTest = 0.2436411292\n",
      "[14:58:22] bestIteration = 3999\n",
      "[14:58:23] ===== Start working with \u001b[1mfold 1\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:58:23] 0:\tlearn: 2.2634693\ttest: 2.2632523\tbest: 2.2632523 (0)\ttotal: 6.07ms\tremaining: 24.3s\n",
      "[14:58:43] bestTest = 0.2658199756\n",
      "[14:58:43] bestIteration = 3999\n",
      "[14:58:43] ===== Start working with \u001b[1mfold 2\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:58:44] 0:\tlearn: 2.2631659\ttest: 2.2656305\tbest: 2.2656305 (0)\ttotal: 6.52ms\tremaining: 26.1s\n",
      "[14:59:03] bestTest = 0.2753673959\n",
      "[14:59:03] bestIteration = 3999\n",
      "[14:59:04] ===== Start working with \u001b[1mfold 3\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:59:04] 0:\tlearn: 2.2645703\ttest: 2.2657044\tbest: 2.2657044 (0)\ttotal: 6.13ms\tremaining: 24.5s\n",
      "[14:59:24] bestTest = 0.2738942971\n",
      "[14:59:24] bestIteration = 3996\n",
      "[14:59:24] Shrink model to first 3997 iterations.\n",
      "[14:59:24] ===== Start working with \u001b[1mfold 4\u001b[0m for \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m =====\n",
      "[14:59:25] 0:\tlearn: 2.2642798\ttest: 2.2644247\tbest: 2.2644247 (0)\ttotal: 5.95ms\tremaining: 23.8s\n",
      "[14:59:44] bestTest = 0.2538460547\n",
      "[14:59:44] bestIteration = 3999\n",
      "[14:59:45] Fitting \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m finished. score = \u001b[1m-0.2625123265864018\u001b[0m\n",
      "[14:59:45] \u001b[1mLvl_0_Pipe_1_Mod_0_CatBoost\u001b[0m fitting and predicting completed\n",
      "[14:59:45] Time left 16678.32 secs\n",
      "\n",
      "[14:59:45] \u001b[1mLayer 1 training completed.\u001b[0m\n",
      "\n",
      "[14:59:45] Blending: optimization starts with equal weights and score \u001b[1m-0.2561708318332855\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/dvladimirvasilyev/anaconda3/envs/myenv/lib/python3.8/site-packages/sklearn/metrics/_classification.py:2916: UserWarning: The y_pred values do not sum to one. Starting from 1.5 thiswill result in an error.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14:59:45] Blending: iteration \u001b[1m0\u001b[0m: score = \u001b[1m-0.23692344794948073\u001b[0m, weights = \u001b[1m[0.19089036 0.8091096 ]\u001b[0m\n",
      "[14:59:46] Blending: iteration \u001b[1m1\u001b[0m: score = \u001b[1m-0.23692344794948073\u001b[0m, weights = \u001b[1m[0.19089036 0.8091096 ]\u001b[0m\n",
      "[14:59:46] Blending: no score update. Terminated\n",
      "\n",
      "[14:59:46] \u001b[1mAutoml preset training completed in 1323.26 seconds\u001b[0m\n",
      "\n",
      "[14:59:46] Model description:\n",
      "Final prediction for new objects (level 0) = \n",
      "\t 0.19089 * (5 averaged models Lvl_0_Pipe_0_Mod_0_LinearL2) +\n",
      "\t 0.80911 * (5 averaged models Lvl_0_Pipe_1_Mod_0_CatBoost) \n",
      "\n",
      "CPU times: user 20min 56s, sys: 1min 25s, total: 22min 22s\n",
      "Wall time: 22min 3s\n"
     ]
    }
   ],
   "source": [
    "%%time \n",
    "\n",
    "oof_pred = automl.fit_predict(train_data, roles = roles, verbose = 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 163/163 [01:16<00:00,  2.13it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[15:01:03] Feature path transformed\n",
      "Prediction for te_data:\n",
      "array([[5.8534566e-02, 6.8576052e-03, 4.5334366e-01, ..., 1.5735241e-02,\n",
      "        4.2415738e-07, 2.8625556e-05],\n",
      "       [9.6386713e-01, 1.4697504e-03, 3.2047924e-02, ..., 2.0407902e-03,\n",
      "        6.7228694e-07, 1.4319470e-07],\n",
      "       [3.5120246e-01, 2.9431397e-01, 1.9644174e-01, ..., 2.2667376e-04,\n",
      "        6.4593733e-06, 5.9228983e-05],\n",
      "       ...,\n",
      "       [2.3565248e-03, 2.7670001e-05, 1.2790265e-02, ..., 9.7831573e-05,\n",
      "        4.5524594e-08, 1.1057142e-07],\n",
      "       [1.4637065e-03, 9.7479615e-06, 1.1323140e-02, ..., 4.7557736e-05,\n",
      "        4.5515264e-08, 6.8441139e-08],\n",
      "       [3.5254466e-03, 2.2519611e-05, 5.6939691e-02, ..., 2.6386546e-04,\n",
      "        4.5536019e-08, 1.7701051e-07]], dtype=float32)\n",
      "Shape = (20814, 10)\n",
      "CPU times: user 13 s, sys: 3.3 s, total: 16.3 s\n",
      "Wall time: 2min 7s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "te_pred = automl.predict(submission)\n",
    "print(f'Prediction for te_data:\\n{te_pred}\\nShape = {te_pred.shape}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our submission has 0.95770 accuracy on [public](https://www.kaggle.com/competitions/paddy-disease-classification/leaderboard?tab=public#) and 0.95276 accuracy on [private](https://www.kaggle.com/competitions/paddy-disease-classification/leaderboard?) leaderboard ([Alexander Ryzhkov](https://www.kaggle.com/alexryzhkov) account).\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.14221,
     "end_time": "2021-06-22T20:35:48.782561",
     "exception": false,
     "start_time": "2021-06-22T20:35:48.640351",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Additional materials"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "papermill": {
     "duration": 0.147943,
     "end_time": "2021-06-22T20:35:49.074531",
     "exception": false,
     "start_time": "2021-06-22T20:35:48.926588",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "- [Official LightAutoML github repo](https://github.com/sb-ai-lab/LightAutoML)\n",
    "- [LightAutoML documentation](https://lightautoml.readthedocs.io/en/latest)\n",
    "- [LightAutoML tutorials](https://github.com/sb-ai-lab/LightAutoML/tree/master/examples/tutorials)\n",
    "- LightAutoML course:\n",
    "    - [Part 1 - general overview](https://ods.ai/tracks/automl-course-part1) \n",
    "    - [Part 2 - LightAutoML specific applications](https://ods.ai/tracks/automl-course-part2)\n",
    "    - [Part 3 - LightAutoML customization](https://ods.ai/tracks/automl-course-part3)\n",
    "- [OpenDataScience AutoML benchmark leaderboard](https://ods.ai/competitions/automl-benchmark/leaderboard)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "my_jup_kernel",
   "language": "python",
   "name": "my_jup_kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  },
  "vscode": {
   "interpreter": {
    "hash": "77738023c946bcedeeb6a5c983bcfb7849325694ebd87acbc9267f45e9f4af48"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
